package com.eduagent.xwqeduagent.service;

import com.eduagent.xwqeduagent.utils.CosUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import java.util.UUID;

/**
 * 通用文件服务
 */
@Service
@Slf4j
public class FileService {

    private static final String TEMP_DIR = System.getProperty("java.io.tmpdir");

    @Autowired
    private CosUtils cosUtils;

    /**
     * 上传文件到指定目录
     *
     * @param file 文件
     * @param directory 目录
     * @return 文件访问URL
     */
    public String uploadFile(MultipartFile file, String directory) {
        if (file.isEmpty()) {
            throw new IllegalArgumentException("文件为空");
        }
        return cosUtils.uploadFile(file, directory);
    }

    /**
     * 上传字符串内容为文件
     *
     * @param content 文件内容
     * @param fileName 文件名
     * @param directory 目录
     * @return 文件访问URL
     */
    public String uploadContent(String content, String fileName, String directory) {
        try {
            // 创建临时文件
            File tempFile = File.createTempFile("upload_", "_" + fileName);
            
            // 写入内容
            try (FileOutputStream fos = new FileOutputStream(tempFile)) {
                fos.write(content.getBytes(StandardCharsets.UTF_8));
            }
            
            // 上传到COS
            String fileUrl = cosUtils.uploadFile(tempFile, directory);
            
            // 删除临时文件
            if (!tempFile.delete()) {
                log.warn("Failed to delete temporary file: {}", tempFile.getAbsolutePath());
            }
            
            return fileUrl;
        } catch (IOException e) {
            log.error("Error creating temporary file: {}", e.getMessage(), e);
            throw new RuntimeException("创建临时文件失败: " + e.getMessage(), e);
        }
    }

    /**
     * 删除文件
     *
     * @param fileUrl 文件URL
     * @return 是否删除成功
     */
    public boolean deleteFile(String fileUrl) {
        return cosUtils.deleteFile(fileUrl);
    }

    /**
     * 检查文件是否存在
     *
     * @param fileUrl 文件URL
     * @return 是否存在
     */
    public boolean doesFileExist(String fileUrl) {
        String key = cosUtils.getFileKeyFromUrl(fileUrl);
        return cosUtils.doesObjectExist(key);
    }

    /**
     * 获取文件内容
     *
     * @param fileUrl 文件URL
     * @return 文件内容
     */
    public String getFileContent(String fileUrl) {
        String key = cosUtils.getFileKeyFromUrl(fileUrl);
        if (!cosUtils.doesObjectExist(key)) {
            throw new RuntimeException("文件不存在: " + fileUrl);
        }
        return cosUtils.getFileContentAsString(key);
    }

    /**
     * 下载文件到本地
     *
     * @param fileUrl 文件URL
     * @param localFile 本地文件
     * @return 是否下载成功
     */
    public boolean downloadFile(String fileUrl, File localFile) {
        String key = cosUtils.getFileKeyFromUrl(fileUrl);
        if (!cosUtils.doesObjectExist(key)) {
            throw new RuntimeException("文件不存在: " + fileUrl);
        }
        return cosUtils.downloadFile(key, localFile);
    }

    /**
     * 下载文件到临时目录
     *
     * @param fileUrl 文件URL
     * @return 临时文件
     */
    public File downloadToTemp(String fileUrl) {
        try {
            String key = cosUtils.getFileKeyFromUrl(fileUrl);
            if (!cosUtils.doesObjectExist(key)) {
                throw new RuntimeException("文件不存在: " + fileUrl);
            }
            
            // 从URL提取文件名
            String fileName = key.substring(key.lastIndexOf("/") + 1);
            File tempFile = File.createTempFile("download_", "_" + fileName);
            
            if (cosUtils.downloadFile(key, tempFile)) {
                return tempFile;
            } else {
                throw new RuntimeException("下载文件失败: " + fileUrl);
            }
        } catch (IOException e) {
            log.error("Error creating temporary file: {}", e.getMessage(), e);
            throw new RuntimeException("创建临时文件失败: " + e.getMessage(), e);
        }
    }
} 